package lab8;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

/**
 * @author wangcheng 本类继承自Reducer类，负责重写Reducer中的reduce方法 Reducer < Text ,
 *         IntWritable , Text , IntWritable >泛型参数含义：
 *         第一个Text表示reduce函数输入的健值对的健值类型，IntWritable表示reduce函数输入健值对的值类型，
 *         第二个Text表示reduce函数输出的key类型，IntWritable表示reduce函数输出健值对的值类型
 */

public class UidReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

	// 定义各个用户搜索次数的变量
	private IntWritable result = new IntWritable();

	/**
	 * reduce方法主要负责对map方法处理之后的中间结果做最后处理 参数key是map方法处理完输出的中间结果键值对的健值
	 * value是map方法处理完输出的中间结果值的列表 context是MapReducer框架的上下文对象，可以存放公共类型数据，比如reduce
	 * 方法处理完的中间结果可以保存到context上下文对象中，由上下文再写入HDFS中
	 */

	public void reduce(Text key, java.lang.Iterable<IntWritable> values,
			org.apache.hadoop.mapreduce.Reducer<Text, IntWritable, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		// 定义一个整数变量，用来实现各个用户搜素次数的累加
		int sum = 0;
		// 循环遍历key所对应的values列表中的所有values的值，然后进行累加
		for (IntWritable v : values) {
			sum += v.get();
		}
		// 将查询次数大于等于20次搜素的用户进行输出
		if (sum >= 20) {
			result.set(sum);
			context.write(key, result);
		}
	}
}